package com.itany.shop.service.impl;

import com.itany.shop.dao.UserDao;
import com.itany.shop.entity.User;
import com.itany.shop.exception.*;
import com.itany.shop.factory.ObjectFactory;
import com.itany.shop.service.UserService;
import com.itany.shop.util.MD5Util;
import com.itany.shop.util.ParameterUtil;

/**
 * @author 石小俊
 */
public class UserServiceImpl implements UserService {

    private UserDao userDao = (UserDao) ObjectFactory.getObject("userDao");

    @Override
    public void register(String username, String password, String phone, String address) throws RequestParameterErrorException, UserExistException {
        // 1.参数校验:非空校验、正则表达式等
        if (ParameterUtil.isNull(username) || ParameterUtil.isNull(password) || ParameterUtil.isNull(phone) || ParameterUtil.isNull(address)) {
            throw new RequestParameterErrorException("请求参数有误");
        }

        // 2.业务校验:与业务相关的校验操作
        // 例如:用户名不能重复
        // 根据传递过来的用户名调用持久层方法进入数据库查询
        User selectUser = userDao.selectByUsername(username);
        // 如果不为null,则说明查询到对应数据了,即表示数据库已经存在重名的用户了
        if (selectUser != null) {
            throw new UserExistException("此用户名太受欢迎,请更换一个");
        }

        // 3.注册的核心业务
        // 对密码使用MD5加密
        User user = new User(username, MD5Util.md5(password), phone, address);
        // 加密后调用持久层方法将对应的数据插入到数据库中
        userDao.insertUser(user);
    }

    @Override
    public User login(String username, String password) throws RequestParameterErrorException, UserNotExistException {
        // 非空校验
        if (ParameterUtil.isNull(username) || ParameterUtil.isNull(password)) {
            throw new RequestParameterErrorException("请求参数有误");
        }

        // 调用dao方法查询
        User user = userDao.selectByUsernameAndPassword(username, MD5Util.md5(password));
        // 如果没有查询到数据
        if (user == null) {
            // 用户名或密码错误
            throw new UserNotExistException("用户名或密码错误");
        }
        return user;
    }

    @Override
    public User login(String username, String password, String code, String image) throws RequestParameterErrorException, UserNotExistException, CodeErrorException {
        // 非空校验
        if (ParameterUtil.isNull(username) || ParameterUtil.isNull(password) || ParameterUtil.isNull(image) || ParameterUtil.isNull(code)) {
            throw new RequestParameterErrorException("请求参数有误");
        }

        // 判断验证码是否正确
        if (!code.equals(image)) {
            throw new CodeErrorException("验证码不正确");
        }

        // 调用dao方法查询
        User user = userDao.selectByUsernameAndPassword(username, MD5Util.md5(password));
        // 如果没有查询到数据
        if (user == null) {
            // 用户名或密码错误
            throw new UserNotExistException("用户名或密码错误");
        }
        return user;
    }

    @Override
    public void modifyPassword(String password, String oldPassword, User user) throws RequestParameterErrorException, PasswordErrorException, UserNotExistException {
        if (user == null) {
            throw new UserNotExistException("请先登录");
        }
        if (ParameterUtil.isNull(password) || ParameterUtil.isNull(oldPassword)) {
            throw new RequestParameterErrorException("请求参数有误");
        }
        if (!MD5Util.md5(oldPassword).equals(user.getPassword())) {
            throw new PasswordErrorException("原密码不正确");
        }
        userDao.updatePasswordById(user.getId(), MD5Util.md5(password));
    }
}
